package com.kfd.service;

import com.kfd.bean.Eadmin;
import com.kfd.bean.Express;
import com.kfd.dao.EadminDao;
import com.kfd.daoImpl.EadminDaoImpl;
import com.kfd.exception.DuplicateCodeException;
import com.kfd.exception.DuplicateNumberException;

import java.util.Date;
import java.util.List;
import java.util.Map;

public class EadminService {
    private static EadminDao dao = new EadminDaoImpl();

    /**
     * 更新登陆时间与ip
     * @param username 用户名
     * @param date  登陆时间
     * @param ip    ip
     */
    public static void updateLoginIpTime(String username, Date date, String ip){
        dao.updateLoginIpTime(username, date, ip);
    }

    /**
     * 登录
     * @param username  用户名
     * @param password  密码
     * @return  true登陆成功
     */
    public static String login(String username, String password) {
        return dao.login(username,password);
    }



    /**
     * 控制台方法
     *
     * @return 返回控制台所需的信息
     */
    public static List<Map<String, Integer>> console() {
        return dao.console();
    }

    /**
     * 查询所有用户
     *
     * @param limit      是否开启分页；true表示开启分页
     * @param offset     sql语句起始下标
     * @param pageNumber 共查询多少条
     * @param status     0，用户页面，1.快递员页面
     * @return 用户的集合
     */
    public static List<Eadmin> findAll(boolean limit, int offset, int pageNumber, int status) {
        return dao.findAll(limit,offset,pageNumber,status);
    }

    /**
     * 根据手机号查询用户信息
     *
     * @param phone  用户手机号
     * @param status 0,用户；1.快递员
     * @return 查询到的用户信息，有可能为空返回null，手机号不存在
     */
    public static Eadmin findByPhone(String phone, int status) {
        return dao.findByPhone(phone,status);
    }

    /**
     * 用户的录入
     *
     * @param eadmin 用户信息
     * @param status 0.用户，1.快递员
     * @return 返回是否录入成功
     */
    public static boolean insert(Eadmin eadmin, int status) throws DuplicateCodeException, DuplicateNumberException {
        return dao.insert(eadmin,status);
    }

    /**
     * 用户修改
     *
     * @param eadmin 用户信息
     * @return 返回是否修改成功
     */
    //TODO 用户信息修改后，快件原本的信息也需要修改;没有用事务
    public static boolean update(Eadmin eadmin) {
        boolean result=false;
        Eadmin byId = EadminService.findById(eadmin.getId());
        if("0".equals(eadmin.getStatus())){
            List<Express> byUserPhone = ExpressService.findByUserPhone(byId.getUserPhone(), 0);
            if(byUserPhone != null){
                for (Express express : byUserPhone) {
                    express.setUserphone(eadmin.getUserPhone());
                    result = ExpressService.update(express);
                    if(!result)
                        return false;
                }
            }
            result=true;
        }else{
            List<Express> byUserPhone = ExpressService.findByUserPhone(byId.getUserPhone(), 0);
            if(byUserPhone != null){
                for (Express express : byUserPhone) {
                    express.setUserphone(eadmin.getUserPhone());
                    result = ExpressService.update(express);
                    if(!result)
                        return false;
                }
            }
            List<Express> bySysPhone = ExpressService.findBySysPhone(byId.getUserPhone());
            if(bySysPhone != null){
                for (Express express : bySysPhone) {
                    express.setSysPhone(eadmin.getUserPhone());
                    result = ExpressService.update(express);
                    if(!result)
                        return false;
                }
            }
            result=true;
        }
        eadmin.setUsername(byId.getUsername());
        if(eadmin.getUserPhone() == null){
            eadmin.setUserPhone(byId.getUserPhone());
        }
        boolean update = dao.update(eadmin);
        return update==result&&result==true?true:false;
    }

    /**
     * 快递的删除用户删除
     * param id   用户的id
     *
     * @param id
     * @return 返回是否删除成功
     */
    //TODO 用户删除，必须其下面没有需要接收的快递才可以删除，删除时需要回显，其下面是否还有快递
    public static boolean delete(int id,int status) {
        return dao.delete(id,status);
    }

    public static Eadmin findById(int id) {
        return dao.findById(id);
    }
}
